状态流转AbstractQueuedSynchronizer几个主要属性:exclusiveOwnerThread:持有当前锁的线程state:加锁状态,是个int值,通过判断和维护此状态实现锁互斥逻辑和锁重入状态 initialTryLock()) acquire(1); // AbstractQueuedSynchronizer.acquire()}// ReentrantLock.FairSync.initialTryLock ); setState(c); // 锁重入次数+1 return true; // 加锁成功 } return false; // 加锁失败}// AbstractQueuedSynchronizer.acquire Thread.currentThread()); // 设置锁owner为当前线程 return true; // 加锁成功 } return false; // 加锁失败}// AbstractQueuedSynchronizer.acquire all) break; } first = next; }}一些AbstractQueuedSynchronizer的实现类Semaphore
AQS,AbstractQueuedSynchronizer,即队列同步器。 下面我们通过源码来分析下AQS的实现原理 AbstractQueuedSynchronizer类结构 public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable { protected AbstractQueuedSynchronizer
AbstractQueuedSynchronizer提供了一个实现锁和同步器的框架,它处理很多细节点,比如先进先出等待队列,同时,我们可以自定义同步器的一些标准,比如线程是否执行,是否等待。 最常用的ReentrantLock正是通过一个继承AbstractQueuedSynchronizer的内部类来实现的。 这些同步器类似于闸门,而线程正是其中的水流,当达到某一标准或限度,闸门打开放水,若不满足条件,则关闭闸门,水流进入等待状态,这就要涉及到状态的管理,AbstractQueuedSynchronizer通过一个 在排他模式下(其他线程对其获取将被阻止),AbstractQueuedSynchronizer实现类一般需要重写tryAcquire,tryRelease和isHeldExclusively方法,在共享模式下 */ public class LimitLatch { private class Sync extends AbstractQueuedSynchronizer { private static
AbstractQueuedSynchronizer 就是那个大名鼎鼎的 AQS,是java.util.concurrent包下同步器的核心。
AbstractQueuedSynchronizer(AQS),是 Java 并发包中,实现各种同步结构和部分其他组成单元(如线程池中的 Worker)的基础。 AbstractQueuedSynchronizer关键属性 下面来看看acquire获取锁的部分源码: public abstract class AbstractQueuedSynchronizer 在AbstractQueuedSynchronizer里tryAcquire方法是留给子类来实现的,下面来看看ReentrantLock里的非公平锁是如何实现这里的逻辑的。 源码如下: abstract static class Sync extends AbstractQueuedSynchronizer { //非公平锁最终最调用到当前这个方法,传入的acquires 下面再来看看释放锁的逻辑AbstractQueuedSynchronizer的relase源码如下: //释放锁需要调用release方法 public final boolean release
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top AQS (AbstractQueuedSynchronizer) 概述 AQS ,即 AbstractQueuedSynchronizer,是Java并发包中的一个核心组件,它为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关的同步器(如信号量、事件等)提供了一个框架。 AQS 的使用示例 以下是一个简化的 AQS 使用示例,展示了如何实现一个独占锁: class Mutex extends AbstractQueuedSynchronizer { // 尝试获取锁
Class * AbstractQueuedSynchronizer does not implement any * synchronization interface. No * AbstractQueuedSynchronizer method otherwise creates such a * condition, so if this constraint These can be exported as desired into classes * using an AbstractQueuedSynchronizer for their * * @since 1.5 * @author Doug Lea */ public abstract class AbstractQueuedSynchronizer extends instance * with initial synchronization state of zero. */ protected AbstractQueuedSynchronizer
无论是公平锁还是非公平锁,它们的实现都依赖于AbstractQueuedSynchronizer,它提供了一个基于先进先出等待队列 实现block locks和synchronizers的框架。 node);//首次入队 return node; } 获取失败进行入队操作,首先就是往队列中添加一个正在等待的节点Node image.png 从Node本身的结构可以看到,AQS(AbstractQueuedSynchronizer
前面我们已经介绍和分析了管程,以及 JVM 层面的管程而 AQS 则是 Java 并发包中管程的一种实现。
概述AbstractQueuedSynchronizer,抽象队列同步器,简称AQS,用于构建同步器,抽象类,是JUC包下CountDownLatch、ReentrantLock、RenntrantReadWriteLock
“ AbstractQueuedSynchronizer抽象类(下面简称AQS)在锁框架中,占据着核心地位,它提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架。” ? 01 — AQS AQS: public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer
前言 队列同步器 AbstractQueuedSynchronizer(以下简称 AQS),是用来构建锁或者其他同步组件的基础框架。 下面是具体实现: JAVA import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.AbstractQueuedSynchronizer public class Mutex implements Lock { // 通过继承 AQS,自定义同步器 private static class Sync extends AbstractQueuedSynchronizer 下面是具体实现: JAVA import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.AbstractQueuedSynchronizer 的实现分析(上) AbstractQueuedSynchronizer 源码分析 聊聊并发(十二)—AQS 分析 AbstractQueuedSynchronizer (AQS) 并发编程实践二:AbstractQueuedSynchronize
前言 建议先看一下上一个分享:CAS实现原理 JUC中的许多并发工具类ReentrantLock,CountDownLatch等的实现都依赖AbstractQueuedSynchronizer ? AbstractQueuedSynchronizer定义了一个锁实现的内部流程,而如何上锁和解锁则在各个子类中实现,典型的模板方法模式 模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中 condition,即在condition队列中 PROPAGATE -3 表示releaseShared需要被传播给后续节点(仅在共享模式下使用) 0 当前节点在队列中等待获取锁 再来看AbstractQueuedSynchronizer 所不同的是isInterrupted不会清除这种状态,而interrupted则会清除这种这种状态(即中断状态的复位),所以两次调用interrupted,第一次为true,第二次则为false 为什么AbstractQueuedSynchronizer
使用到的其他类说明和资料 LockSupport 简要说明 在AbstractQueuedSynchronizer中使用LockSupport类来实现线程的挂起和唤醒,对应方法分别我park和unpark AbstractQueuedSynchronizer 源码解析 ps:condition相关的先不涉及,单纯的看lock相关源码 ps2:单独看AQS很抽象,我们结合具体类来了解相关功能 ps3:要用多线程的思维去看 latch的count,每当有线程countDown时,state就减一,ReentrantLock标识锁的重入次数,进入+1,释放-1 head,tail 队列的头尾,下面会说明下队列 内部类Node AbstractQueuedSynchronizer 一下表明任务完成,主线程一直await到所有的任务执行完毕才会退出 内部类Sync继承了AQS,重载了share相关的两个方法 private static final class Sync extends AbstractQueuedSynchronizer
一、前言 在上一篇中,我们对LockSupport进行了阅读,因为它是实现我们今天要分析的AbstractQueuedSynchronizer(简称AQS)的基础,重新用一下最开始的图: 可以看到,在ReentrantLock // 在condition中用到 Node nextWaiter; } 在AQS中,用head,tail来记录了队列的头和尾,方便快速操作队列: public abstract class AbstractQueuedSynchronizer
概述 前文「JDK源码分析-AbstractQueuedSynchronizer(1)」初步分析了 AQS,其中提到了 Node 节点的「独占模式」和「共享模式」,其实 AQS 也主要是围绕对这两种模式的操作进行的 相关阅读: JDK源码分析-AbstractQueuedSynchronizer(1) JDK源码分析-Lock&Condition Stay hungry, stay foolish.
概述 前文「JDK源码分析-AbstractQueuedSynchronizer(2)」分析了 AQS 在独占模式下获取资源的流程,本文分析共享模式下的相关操作。 相关阅读: JDK源码分析-AbstractQueuedSynchronizer(2) JDK源码分析-AbstractQueuedSynchronizer(1) Stay hungry, stay foolish
一、前言 在上一篇中,我们对LockSupport进行了阅读,因为它是实现我们今天要分析的AbstractQueuedSynchronizer(简称AQS)的基础,重新用一下最开始的图: 可以看到,在ReentrantLock // 在condition中用到 Node nextWaiter; } 在AQS中,用head,tail来记录了队列的头和尾,方便快速操作队列: public abstract class AbstractQueuedSynchronizer
ReentrantLock 的实现主要依赖于其内部的一个嵌套类 Sync,而 Sync 又继承自 AbstractQueuedSynchronizer (简称 AQS)。 代码分析 AQS 类签名: public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer final long nextOffset; static { try { stateOffset = unsafe.objectFieldOffset (AbstractQueuedSynchronizer.class.getDeclaredField ("state")); headOffset = unsafe.objectFieldOffset (AbstractQueuedSynchronizer.class.getDeclaredField ("head")); tailOffset = unsafe.objectFieldOffset (AbstractQueuedSynchronizer.class.getDeclaredField
当你查看源码时你会惊讶的发现ReentrantLock并没有多少代码,另外有一个很明显的特点是:基本上所有的方法的实现实际上都是调用了其静态内存类Sync中的方法,而Sync类继承了AbstractQueuedSynchronizer 可以看出要想理解ReentrantLock关键核心在于对队列同步器AbstractQueuedSynchronizer(简称同步器)的理解。 Class {@code AbstractQueuedSynchronizer} does not implement any synchronization interface. // Our internal helper class // 继承AQS的静态内存类 // 重写方法 private static class Sync extends AbstractQueuedSynchronizer